package write.oo;

/**
 * 继承extends
 * 作用：代码复用
 * 通过extends实现继承
 *
 * 超类/父类：共有的属性和行为
 * 派生类/子类：特有的属性和行为
 * 派生类可以访问：超类的+派生类的，超类不能访问派生类的
 *
 * 一个超类可以有多个派生类，一个派生类只能有一个超类---------单一继承
 * 具有传递性
 *
 * extends实现了多态。
 * extends存在默认继承，即 类名后若未写extends,则等于写了extends Object。
 * 默认继承导致所有的类都是多态的
 */
public class Student extends Person{
    /**
     * 超类/父类：共有的属性和行为
     * 派生类/子类：特有的属性和行为
     * 派生类可以访问：超类的+派生类的，超类不能访问派生类的
     */
    String stuId;

    /**
     * java规定：构造派生类之前必须先构造超类
     * 在派生类的构造方法中若没有调用超类的构造方法，则默认super()调用超类的无参构造方法
     * 在派生类的构造方法中若自己调用了超类的构造方法，则不再默认提供
     * 注意：super()调用超类构造方法，必须位于派生类构造方法中的第1行
     */
    public Student(){
        super();
    }

    /**
     * super：指代当前对象的超类对象
     * super.成员变量名-------------------------访问超类的成员变量
     *      当超类成员变量和派生类成员变量同名时，super指超类的，this指派生类的
     *      若没有同名现象，则写super和this是一样的
     * super.方法名()------------------------------调用超类的方法(可省略)
     * 【主要使用】super()---------------------------------调用超类的构造方法
     */
    public Student(String name, int age){
        //若属性的访问控制权限允许子类访问，则this./super.都可以指向成员变量，
        //但因为javaBean规范，成员变量私有化，无法使用
        /*
        this.name = name;
        this.age = age;

        super.name = name;
        super.age = age;
        */
        super(name,age);
    }

    public void sayHello(){
        super.sayHi();
    }

    /**
     * 方法的重写(override/overriding)：重新写、覆盖
     *  发生在父子类中，
     *  方法名相同，参数列表相同，
     *  返回值类型要小于等于父类(如果是基本类型/void，必须相同；如果是引用类型，可以小于等于)，
     *  抛出的异常要小于等于父类，
     *  访问控制权限大于等于父类的
     * 重写方法被调用时，看对象的类型
     */
    public void say(){
        System.out.println("重写"+stuId);
    }
}
